/**
 * 封装 axios 请求模块
 */
import axios from 'axios'
import store from '@/store'
import jsonBig from 'json-bigint'

// 便于后期添加多个基地址
const request = axios.create({
  // baseURL: 'http://ttapi.research.itcast.cn/app/', // 基础路径
  baseURL: 'http://toutiao-app.itheima.net/', // 基础路径

  // 自定义处理返回的数据类型
  // jsonBig.parse():处理超出js规定范围的数字，转换为字符串
  transformResponse: [
    function (data) {
      try {
        // 如果转换成功则返回转换的数据结果
        return jsonBig.parse(data)
      } catch (err) {
        // 如果转换失败，则包装为统一数据格式并返回
        return {
          data
        }
      }
    }
  ]
})

// 设置请求拦截器，配置请求头
request.interceptors.request.use(
  function (config) {
    const { user } = store.state
    // console.log(user)

    // 判断是否有token,如果没有，则需要添加
    if (user && user.token && !config.headers.Authorization) {
      config.headers.Authorization = `Bearer ${user.token}`
    }

    return config
  },
  function (err) {
    return Promise.reject(err)
  }
)

// 响应拦截器，刷新token
request.interceptors.response.use(
  config => {
    return config
  },
  err => {
    // token过期，需要重新加载
    if (err.response.status === 401) {
      console.log('用户token过期')
      getNewToken(store)
    }

    // 把异常抛出去
    return Promise.reject(err)
  }
)

// 获取新的token
async function getNewToken (store) {
  const { user } = store.state
  if (user && user.refresh_token) {
    const { data: res } = await request({
      url: 'v1_0/authorizations',
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${user.refresh_token}`
      }
    })
    console.log(res)
    if (res.message === 'OK') {
      store.commit('setNewToken', res.data.token)
      // 手动刷新页面
      window.location.reload()
    }
  }
}

export default request
